package pl.ps.wi.monitoring.station;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @date 19.05.2010
* @version 1.0
*
* @brief Klasa oblicza funkcję skrótu
*
*  Klasa posiada jedną główną funkcję computeSum(String input) oraz pomocniczą toHex(int s)
 */
public class Utils {
/**
 * za pomoca klasy MessageDigest (wbudowana klasa Javy) funkcja liczy wartość funkcji skrotu MD5 dla łańcucha znaków. Funkcja skrótu jest zwracana w postaci także stringa. 
 * Do obliczeń wykorzystuje metodę toHex. Wyrzuca wyjątek w przypadku nie podania argumentu. Wywoływana w metodzie CardActions::onLogginAttempt()
@throws NoSuchAlgorithmException
 */
	public static String computeSum(String input)
		throws NoSuchAlgorithmException {
	
		if (input == null) {
			throw new IllegalArgumentException("Input cannot be null!");
		}
		
		StringBuffer sbuf = new StringBuffer();
		MessageDigest md = MessageDigest.getInstance("MD5");
		byte[] raw = md.digest(input.getBytes());
		
		for (int i = 0; i < raw.length; i++) {
			int c = (int) raw[i];
			if (c < 0) {
				c = (Math.abs(c) - 1) ^ 255;
			}
			String block = toHex(c >>> 4) + toHex(c & 15);
			sbuf.append(block);
		}
		return sbuf.toString();
	
	}
	
	/**
	Metoda zamienia liczbę całkowitą przekazaną w argumencie na wartość hexadecymalną i zwraca tę wartość w postaci stringa. Wykorzystywana tylko w metodzie ComputeSum(String input)
	*/
	private static final String toHex(int s) {
		if (s < 10) {
			return new StringBuffer().append((char) ('0' + s)).toString();
		} else {
			return new StringBuffer().append((char) ('A' + (s - 10)))
					.toString();
		}
	}
	
}
